package cn.hinglo.gameclaw.user.action;

import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.enums.ExceptionEnum;
import cn.hinglo.gameclaw.data.utils.FieldUtils;
import cn.hinglo.gameclaw.data.utils.JwtUtil;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.entity.ClientLogin;
import cn.hinglo.gameclaw.user.entity.Users;
import cn.hinglo.gameclaw.user.service.LoginService;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @createTime: 2018/1/2
 * @author: HingLo
 * @description: 登录Action
 */
@RestController
@RequestMapping("u")
@Slf4j
public class LoginAction {
    private final LoginService loginService;

    @Autowired
    public LoginAction(LoginService loginService) {
        this.loginService = loginService;
    }

    /**
     * 系统管理员后台登录
     *
     * @param response      响应对象
     * @param users         登录的封装用户对象信息
     * @param bindingResult 错误信息绑定对象
     * @return 返回登录结果
     */
    @PostMapping("login")
    public Result loginAction(HttpServletResponse response, @Validated Users users, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            //获取错误的信息
            String errorMassage = bindingResult.getFieldError().getDefaultMessage();
            //打印消息
            log.info(errorMassage);
            //返回码为-1,其值为自定义
            return ResultUtils.error(errorMassage);
        }
        //调用服务层的方法进行校验
        String token = loginService.loginMethodService(users);
        if (token == null) {
            log.info("登录失败，账号或者密码错误");
            return ResultUtils.error(ExceptionEnum.LOGINERROR);
        } else {
            response.setHeader(FieldUtils.AUTHORIZATION, token);
            return ResultUtils.success();
        }

    }


    /**
     * 手机端登录的时候上传一些信息
     *
     * @param c 用户的唯一Id 性别(0:不详,1 男，2: 女）类型（QQ 3，微信 2)
     * @return 结果对象
     */
    @PostMapping("clogin")
    public Result loginAction(@Validated ClientLogin c, BindingResult bindingResult) {
        // 将用户的ID转为小写
        c.setId(c.getId().toLowerCase());
        if (bindingResult.hasErrors()) {
            //获取错误的信息
            String errorMassage = bindingResult.getFieldError().getDefaultMessage();
            //打印消息
            log.info(errorMassage);
            //返回码为-1,其值为自定义
            return ResultUtils.error(errorMassage);
        } else {
            //调用服务层的方法进行校验
            String token = loginService.loginMethodService(c);
            if (StrUtil.isBlank(token)) {
                log.info("登录失败，账号或者密码错误");
                return ResultUtils.error(ExceptionEnum.LOGINERROR);
            } else {
                //用户登录成功，就返回与本系统交互的UserToken 与网易云交互的token
                Map<String, String> map = new HashMap<>(2);
                map.put("userToken", JwtUtil.createNoJWT(c.getId(), ""));
                map.put("token", token);
                map.put("nikeName", c.getNikeName());
                //当前用户的唯一Id
                map.put("userId", c.getId());
                return ResultUtils.success(map);
            }
        }
    }

}
